home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / amiga / asrc29k.lha / ttylink.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-08  |  3.7 KB  |  190 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "socket.h"
  5. #include "telnet.h"
  6. #include "session.h"
  7. #include "proc.h"
  8. #include "tty.h"
  9. #include "mailbox.h"
  10. #include "commands.h"
  11. #include "config.h"
  12. #include "files.h"
  13.  
  14. static int Sttylink = -1;    /* Protoype socket for service */
  15. #ifdef    MAILBOX
  16. static int Stelnet = -1;
  17. #endif
  18. static char Tnbanner1[] = "Welcome to TTY-Link at %s\n";
  19. static char Tnbanner2[] = "The System is Unattended";
  20. extern int Attended;
  21.  
  22. int
  23. ttylstart(argc,argv,p)
  24. int argc;
  25. char *argv[];
  26. void *p;
  27. {
  28.     struct sockaddr_in lsocket;
  29.     int s,type;
  30.  
  31.     if(Sttylink != -1){
  32.         freeargs(argc,argv);
  33.         return 0;
  34.     }
  35.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  36.     chname(Curproc,"TTYlink listener");
  37.  
  38.     lsocket.sin_family = AF_INET;
  39.     lsocket.sin_addr.s_addr = INADDR_ANY;
  40.     if(argc < 2)
  41.         lsocket.sin_port = IPPORT_TTYLINK;
  42.     else
  43.         lsocket.sin_port = atoi(argv[1]);
  44.  
  45.     freeargs(argc,argv);
  46.     Sttylink = socket(AF_INET,SOCK_STREAM,0);
  47.     bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
  48.     listen(Sttylink,1);
  49.     for(;;){
  50.         if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
  51.             break;    /* Service is shutting down */
  52.         
  53.         if(availmem() < Memthresh){
  54.             usprintf(s,"System is overloaded; try again later\r\n");
  55.             shutdown(s,1);
  56.         } else {
  57.             type = TELNET;
  58.             newproc("ttylink",2048,ttylhandle,s,(void *)&type,NULL);
  59.         }
  60.     }
  61.     return 0;
  62. }
  63. /* This function handles all incoming "ttylink" sessions, be they TCP,
  64.  * NET/ROM or AX.25
  65.  */
  66. void
  67. ttylhandle(s,t,p)
  68. int s;
  69. void *t;
  70. void *p;
  71. {
  72.     int type,index;
  73.     struct session *sp;
  74.     char addr[MAXSOCKSIZE],buf2[77];
  75.     int len = MAXSOCKSIZE;
  76.     struct telnet tn;
  77.     FILE *fp;
  78.  
  79.     type = * (int *)t;
  80.     sockowner(s,Curproc);    /* We own it now */
  81.     mainlog(s,"open %s",Sestypes[type]);
  82.  
  83.     if(!Attended){
  84.         usprintf(s, "%s\n",
  85.             ((p = getenv("MBATND")) == NULL) ? Tnbanner2 : p);
  86.         close_s(s);
  87.         mainlog(s,"close %s - Unattended",Sestypes[type]);
  88.         return;
  89.     }
  90.  
  91.     /* Allocate a session descriptor */
  92.     if((sp = newsession(NULLCHAR,type)) == NULLSESSION){
  93.         usprintf(s,"Too many sessions\n");
  94.         close_s(s);
  95.         mainlog(s,"close %s - Too many sessions",Sestypes[type]);
  96.         return;
  97.     }
  98.     index = sp - Sessions;
  99.  
  100.     /* Initialize a Telnet protocol descriptor */
  101.     memset((char *)&tn,0,sizeof(tn));
  102.     tn.session = sp;    /* Upward pointer */
  103.     sp->cb.telnet = &tn;    /* Downward pointer */
  104.     sp->s = s;
  105.     sp->proc = Curproc;
  106.  
  107.     getpeername(s,addr,&len);
  108.     tprintf("\007Incoming %s session %u from %s\007\n",
  109.         Sestypes[type],index,psocket(addr));
  110.  
  111.     usprintf(s, Tnbanner1, Hostname);
  112.  
  113.     sprintf(buf2,"%s/TTY.SignOn",SignOn);
  114.     if((fp = fopen(buf2,READ_TEXT)) != NULLFILE) {
  115.         sendfile(fp,s,ASCII_TYPE,0);
  116.         fclose(fp);
  117.     }
  118.  
  119.     tnrecv(&tn);
  120. }
  121.  
  122. /* Shut down Ttylink server */
  123. int
  124. ttyl0(argc,argv,p)
  125. int argc;
  126. char *argv[];
  127. void *p;
  128. {
  129.     close_s(Sttylink);
  130.     Sttylink = -1;
  131.     return 0;
  132. }
  133.  
  134. #ifdef    MAILBOX
  135. /* Start up Telnet server */
  136. int
  137. telnet1(argc,argv,p)
  138. int argc;
  139. char *argv[];
  140. void *p;
  141. {
  142.     struct sockaddr_in lsocket;
  143.     int s;
  144.     int type;
  145.  
  146.     if(Stelnet != -1){
  147.         freeargs(argc,argv);
  148.         return 0;
  149.     }
  150.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  151.     chname(Curproc,"Telnet listener");
  152.  
  153.     lsocket.sin_family = AF_INET;
  154.     lsocket.sin_addr.s_addr = INADDR_ANY;
  155.     if(argc < 2)
  156.         lsocket.sin_port = IPPORT_TELNET;
  157.     else
  158.         lsocket.sin_port = atoi(argv[1]);
  159.     freeargs(argc,argv);
  160.     Stelnet = socket(AF_INET,SOCK_STREAM,0);
  161.     bind(Stelnet,(char *)&lsocket,sizeof(lsocket));
  162.     listen(Stelnet,1);
  163.     for(;;){
  164.         if((s = accept(Stelnet,NULLCHAR,(int *)NULL)) == -1)
  165.             break;    /* Service is shutting down */
  166.  
  167.         if(availmem() < Memthresh){
  168.             shutdown(s,1);
  169.         } else {
  170.             /* Spawn a server */
  171.             type = TELNET;
  172.             newproc("mbox",2048,mbx_incom,s,(void *)&type,NULL);
  173.         }
  174.     }
  175.     return 0;
  176. }
  177. /* Stop telnet server */
  178. int
  179. telnet0(argc,argv,p)
  180. int argc;
  181. char *argv[];
  182. void *p;
  183. {
  184.     close_s(Stelnet);
  185.     Stelnet = -1;
  186.     return 0;
  187. }
  188. #endif
  189.  
  190.